﻿using System;
using System.Collections.Generic;
using Inventione.Framework.BusinessLogic;
using Inventione.Framework.BusinessLogic.Exceptions;
using Inventione.Outsourcing.DataAccess;
using Inventione.Outsourcing.DataLinq;

namespace Inventione.Outsourcing.BusinessLogic
{
    public class BLEmpresa : BLBase 
    {
        // Representa o objeto de acesso a dados
        private DAEmpresa da = null;

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BLEmpresa()
            : base("DEFAULT")
        {
            da = new DAEmpresa("DEFAULT");
        }

        /// <summary>
        /// Construtor utilizando o cliente
        /// </summary>
        /// <param name="tenantId">Identificador do cliente</param>
        public BLEmpresa(string tenantId)
            : base(tenantId)
        {
            da = new DAEmpresa(tenantId);
        }

        /// <summary>
        /// Consulta empresas (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="nmEmpresa">Nome da empresa</param>
        /// <param name="nrCNPJ">CNPJ da empresa</param>
        /// <param name="inTipo">Tipo da empresa (C-Contratante / P-Prestadora de serviço</param>
        /// <param name="inAtivo">Indicador se está ativo ou inativo (S/N)</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de empresas</returns>
        public List<EMPRESA> consultarEmpresas(string nmEmpresa, string nrCNPJ, string inTipo, string inAtivo,
            int maximumRows, int startRowIndex, string sortExpression)
        {
            List<EMPRESA> retorno = null;

            try
            {
                retorno = this.da.consultarEmpresas(nmEmpresa, nrCNPJ, inTipo, inAtivo, maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta empresas (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="nmEmpresa">Nome da empresa</param>
        /// <param name="nrCNPJ">CNPJ da empresa</param>
        /// <param name="inTipo">Tipo da empresa (C-Contratante / P-Prestadora de serviço</param>
        /// <param name="inAtivo">Indicador se está ativo ou inativo (S/N)</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarEmpresasCount(string nmEmpresa, string nrCNPJ, string inTipo, string inAtivo)
        {
            int retorno = 0;

            try
            {
                retorno = da.consultarEmpresasCount(nmEmpresa, nrCNPJ, inTipo, inAtivo);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem uma empresa
        /// </summary>
        /// <param name="cdEmpresa">Código da empresa</param>
        /// <returns>Entidade empresa</returns>
        public EMPRESA obterEmpresa(int cdEmpresa)
        {
            EMPRESA retorno = null;

            try
            {
                retorno = da.obterEmpresa(cdEmpresa);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um empresa
        /// </summary>
        /// <param name="nrCnpj">Nº do CNPJ</param>
        /// <returns>Entidade empresa</returns>
        public EMPRESA obterEmpresa(string nrCnpj)
        {
            EMPRESA retorno = null;

            try
            {
                retorno = da.obterEmpresa(nrCnpj);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem uma empresa
        /// </summary>
        /// <param name="cdEmpresa">Código da empresa</param>
        /// <returns>Lista contendo uma entidade empresa</returns>
        public List<EMPRESA> listarEmpresa(int cdEmpresa)
        {
            List<EMPRESA> retorno = null;

            try
            {
                retorno = this.da.listarEmpresa(cdEmpresa);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #region Métodos para Combos

        /// <summary>
        /// Lista as empresas contratantes que estejam ativas
        /// </summary>
        /// <returns>Lista de empresas</returns>
        public List<TOCombo> listarEmpresasContratantesAtivas()
        {
            List<TOCombo> retorno = null;

            try
            {
                retorno = this.da.listarEmpresasContratantesAtivas();
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista as empresas prestadoras que estejam ativas
        /// </summary>
        /// <returns>Lista de empresas</returns>
        public List<TOCombo> listarEmpresasPrestadorasAtivas()
        {
            List<TOCombo> retorno = null;

            try
            {
                retorno = this.da.listarEmpresasPrestadorasAtivas();
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #endregion

        #region Métodos Básicos - CRUD

        /// <summary>
        /// Insere uma empresa
        /// </summary>
        /// <param name="entity">Entidade empresa</param>
        /// <returns>Código da empresa</returns>
        public int inserirEmpresa(EMPRESA entity)
        {
            int retorno = 0;

            try
            {
                retorno = this.da.inserirEmpresa(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Atualiza os dados de uma empresa
        /// </summary>
        /// <param name="entity">Entidade empresa</param>
        public void atualizarEmpresa(EMPRESA entity)
        {
            try
            {
                this.da.atualizarEmpresa(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Exclui uma empresa
        /// </summary>
        /// <param name="entity">Entidade empresa</param>
        public void excluirEmpresa(EMPRESA entity)
        {
            try
            {
                this.da.excluirEmpresa(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        #endregion
    }
}
